
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Base Class for all 2D Shapes (Shape2D.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	All 2D shapes must inherit & implement all properties and behaviours described in 
*	Shape2D abstract class
* =========================================================================================
*/
#pragma endregion


#ifndef SHAPE2D_H_
#define SHAPE2D_H_


#pragma region INCLUDEs
//
#include "ICollision2D.h"
#include "Vector2.h"

#pragma endregion


namespace Physics
{
	//NOTE: Use virtual inheritance to avoid problems with multiple inheritance...
	class Shape2D: virtual public ICollision2D 
	{
	protected:
		//DATA MEMBERS...
		Vector2 position, direction;
		float speed, mass;

	public:
		//---------------- CONSTRUCTORS ----------------
		Shape2D();																						//C001: Default Constructor
		Shape2D(const Vector2 &pos);																	//C002: Overloaded Constructor
		Shape2D(const Vector2 &pos, const Vector2 &dir);												//C003: Overloaded Constructor
		Shape2D(const Vector2 &pos, const Vector2 &dir, const float speed, const float mass);			//C004: Overloaded Constructor
		Shape2D(const float X, const float Y, const float dir, const float speed, const float mass);	//C005: Overloaded Constructor

		virtual ~Shape2D() { }																			//C006: EMPTY Virtual Destructor, in case this class is inherited later

		//---------------- PROPERTIES ----------------
		virtual const Vector2 getPosition() const;							//M001: Getter Position
		virtual void setPosition(const float X, const float Y);				//M002: Setter Position
		virtual void setPosition(const Vector2 &value);						//M003: Setter Position

		virtual const Vector2 getDirection() const;							//M004: Getter Direction
		virtual void setDirection(const float X, const float Y);			//M005: Setter Direction
		virtual void setDirection(const Vector2 &value);					//M006: Setter Direction

		virtual const float getSpeed() const;								//M007: Getter Speed
		virtual void setSpeed(const float s);								//M008: Setter Speed

		virtual const float getMass() const;								//M009: Getter Mass
		virtual void setMass(const float m);								//M010: Setter Mass

		//NOTE: Center should be calculated on the fly, 
		//based off Position in Concrete classes!!!
		virtual const Vector2 getCenter() const = 0;						//M011: Getter Center


		//---------------- METHODs ----------------
#pragma region ROTATION_2D
		//
		virtual void rotateInDegs(const float degrees) = 0;					//M012: Rotate 2D shape using degrees
		virtual void rotateInRads(const float radians) = 0;					//M013: Rotate 2D shape using radians
#pragma endregion


#pragma region TRANSLATE_POSITION
		//
		virtual void translatePosition(const float X, const float Y) = 0;	//M014: Translate position using floats
		virtual void translatePosition(const Vector2 &value) = 0;			//M015: Translate position using Vector2
#pragma endregion


#pragma region TRANSLATE_DIRECTION
		//
		virtual void translateDirection(const float X, const float Y) = 0;	//M016: Translate direction using floats
		virtual void translateDirection(const Vector2 &value) = 0;			//M017: Translate direction using Vector2
#pragma endregion

	};
} /* NAMESPACE */

#endif